const __formatDate = (d, fmt) => {
  if (!d) {
    return ''
  }

  // trans number to date
  if (typeof d === 'number') {
    d = new Date(d)
  }

  if (!(d instanceof Date)) {
    return d
  }

  let o = {
    'M+': d.getMonth() + 1,     // 月
    'd+': d.getDate(),       // 日
    'h+': d.getHours() % 12 === 0 ? 12 : d.getHours() % 12,   // 小时
    'H+': d.getHours(),      // 小时
    'm+': d.getMinutes(),    // 分
    's+': d.getSeconds(),    // 秒
    'q+': Math.floor((d.getMonth() + 3) / 3),    // 季度
    'S': d.getMilliseconds() // 毫秒
  }

  let week = {
    '0': '\u65e5',
    '1': '\u4e00',
    '2': '\u4e8c',
    '3': '\u4e09',
    '4': '\u56db',
    '5': '\u4e94',
    '6': '\u516d'
  }

  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(RegExp.$1, (d.getFullYear() + '').substr(4 - RegExp.$1.length))
  }

  if (/(E+)/.test(fmt)) {
    fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? '\u661f\u671f' : '\u5468') : '') + week[d.getDay() + ''])
  }

  for (let k in o) {
    if (new RegExp('(' + k + ')').test(fmt)) {
      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
    }
  }

  return fmt
}

// 格式化日期
const _formatDate = (d, fmt) => {
  if (!fmt || typeof fmt !== 'string') {
    fmt = 'yyyy-MM-dd'
  }

  return __formatDate(d, fmt)
}

export default {
  format (d, fmt) {
    return _formatDate(d, fmt)
  },
  // 格式化日期，如2010-01-01
  formatDate (d) {
    return _formatDate(d, 'yyyy-MM-dd')
  },
  // 格式化时间，如12:00:00
  formatTime (d) {
    return _formatDate(d, 'HH:mm:ss')
  },
  // 格式化日期时间，如2010-01-01 12:00:00
  formatDateTime (d) {
    return _formatDate(d, 'yyyy-MM-dd HH:mm:ss')
  },
  // 格式化日期月份, 如2010-01
  formatMonth (d) {
    return _formatDate(d, 'yyyy-MM')
  },
  // 格式化日期小时，如2010-01-01 12:00
  formatHour (d) {
    return _formatDate(d, 'yyyy-MM-dd HH:mm')
  }
}
